// 文件路径：src/main/java/com/example/websocket/WebSocketService.java
package com.campus.websocket;

import jakarta.websocket.*;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * WebSocket 服务端点：用于向用户推送提醒消息
 */
@Component
@Slf4j
@ServerEndpoint("/ws/notice/{userId}")
public class WebSocketService {

    // 存储连接会话：用户ID -> Session
    private static final Map<Long, Session> sessions = new ConcurrentHashMap<>();

    /**
     * 连接建立成功调用
     */
    @OnOpen
    public void onOpen(@PathParam("userId") Long userId, Session session) {
        sessions.put(userId, session);
        System.out.println("用户 " + userId + " 建立 WebSocket 连接");
    }

    /**
     * 连接关闭调用
     */
    @OnClose
    public void onClose(@PathParam("userId") Long userId) {
        sessions.remove(userId);
        System.out.println("用户 " + userId + " 关闭 WebSocket 连接");
    }

    /**
     * 收到客户端消息时（可选）
     */
    @OnMessage
    public void onMessage(String message, @PathParam("userId") Long userId) {
        System.out.println("收到用户 " + userId + " 的消息：" + message);
    }

    /**
     * 发生错误
     */
    @OnError
    public void onError(Session session, Throwable error, @PathParam("userId") Long userId) {
        System.err.println("WebSocket错误 - 用户ID: " + userId + ", 错误信息: " + error.getMessage());
        error.printStackTrace();
        // 移除失效的session
        if (userId != null) {
            sessions.remove(userId);
        }
    }

/**
 * 向指定用户发送消息
 *
 * @param userId  用户ID
 * @param message 消息内容
 */
public void sendMessageToUser(Long userId, String message) {
    Session session = sessions.get(userId);
    if (session != null && session.isOpen()) {
        try {
            session.getAsyncRemote().sendText(message);
        } catch (Exception e) {
            System.err.println("发送消息失败 - 用户ID: " + userId + ", 错误: " + e.getMessage());
            // 移除失效连接
            sessions.remove(userId);
        }
    }
}

    /**
     * 向多个用户批量发送消息
     *
     * @param userIds 用户ID列表
     * @param message 消息内容
     */
    public void sendMessageToUsers(List<Long> userIds, String message) {
        userIds.forEach(userId -> {
            Session session = sessions.get(userId);
            if (session != null && session.isOpen()) {
                session.getAsyncRemote().sendText(message);
            }
        });
    }

    /**
     * 获取连接数（用于调试）
     */
    public int getConnectionCount() {
        return sessions.size();
    }
}